#ifndef __qytabwidget__
#define __qytabwidget__

#include <QTabWidget>
#include <QMap>

class QComboBox;
class QyTabNavigator;

/*! \class QyTabWidget
	\brief QTabWidget с возможностью создания и смены набора(группы) закладок.

	QyTabWidget позволяет создавать несколько именованых наборов закладок. Отображается только один, (текущий) набор закладок. Смена набора осуществляется при помощи  комбобокса распологающегося в левом верхнем углу.

	QyTabWidget имеет "переключатель" закладок в стиле MSVS. Вызывается по Ctrl+Tab. Пока пользователь удерживает Ctrl, диалог "висит" и пользователь может осуществлять навигацию по закладкам при помощи Tab и по группам при помощи стрелок вверх вниз.

*/

class QyTabWidget : public QTabWidget {
	Q_OBJECT
public:
	using QTabWidget::addTab;
	using QTabWidget::removeTab;

	QyTabWidget( QWidget * parent=0 ); //!< Конструктор
	virtual ~QyTabWidget(); //!< Диструктор

	QString currentTabLine() const { return p_currentTabLine; } //!< Имя текущей группы
	QStringList tabLineNames() const { return tabLines.keys(); } //!< Имена всех групп
	QList<QWidget*> widgetsOnLine( const QString & name ) const; //!< Список виджетов определенной группы

public slots:
	void addTab( const QString & tabLineName, const QString & title, QWidget * widget ); //!< добавить закладку в группу
	void removeTab( QWidget * widget, bool deleteWidget=true ); //!< удалить виджет
	void setCurrentTabLine( const QString & tabLineName ); //!< установить текужую группу
	void setCurrentWidget( QWidget * widget ); //!< установить текущий виджет (сделать закладку с этим виджетом видимой)
	void setWidgetTitle( QWidget * widget, const QString & title ); //!< установить заголовок для закладки
	void removeTabLine( QString tabLineName=QString(), bool deleteWidget=true ); //!< удалить группу
	void clear( bool deleteWidget=true ); //!< очистить

signals:
	void tabChanged( const QString & tabLineName, QWidget * widget ); //!< выбрана закладка в группе

private slots:
	void currentTabChanged( int index );
	void currentTabChanged( const QString & tabLineName, int index );

private:
	void keyPressEvent( QKeyEvent * event );

	struct QyTabLine {
		QList<QWidget*> tabs;
		QStringList tabNames;
		int lastIndex;

		QyTabLine() : lastIndex(-1) {}

	};
	QMap<QString,QyTabLine*> tabLines;
	QString p_currentTabLine, p_lastTabLine;
	QComboBox * tabLineBox;
	QyTabNavigator * p_tabNavigator;
	int p_lastIndex;

};

#endif/*__qytabwidget__*/
